package cn.itcast.zookeeper.order;


//   订单模块 获取 商品服务

import cn.itcast.zookeeper.service.ProductService;
import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.ZkClient;

import java.io.IOException;
import java.util.List;

/**
 *   分析：
 *      当用户访问订单模块，下单成功时，订单模块的业务层 将处理订单业务 同时要获取 商品服务
 *      通过商品服务  修改 商品库存数量
 *
 *     模拟 订单服务业务层核心代码
 */
public class OrderServiceImpl {

    /**
     * 服务注册中心根节点path
     * */
    private static final String ROOT_NODE = "/heima_mall";
    public static void main(String[] args) {
            //1. 创建zk连接
            ZkClient zkClient = new ZkClient("192.168.106.128:2181");

            // 2. 商品接口znode监听
            String serviceName = ProductService.class.getName();//  获取商品服务接口名称
          //   3. 获取 服务接口持久节点路径   注意 要和服务端 发布的持久化节点一致
            String servicePath = ROOT_NODE + "/" + serviceName;
            String providorPath = servicePath + "/providers";
            //  监听该节点下的 子节点变化  也就是我们的服务地址
            List<String> children = zkClient.subscribeChildChanges(providorPath, new IZkChildListener() {
                public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception {
                    //   获取  商品服务的服务地址
                    System.out.println("输出服务地址：" + currentChilds);
                    //  后续代码：dubbo为我们实现 ：  持续监听获取服务端的暴露的 服务地址信息   通过RPC远程调用技术 获取远程服务接口实现
//                    ProductService  productService = createProxy(currentChilds);
//                    productService.updateProductNum("p01",10);
                }
            });

            System.out.println("订单模块 正在监听 商品服务地址，输入任何字符 停止服务！");
            //等待关闭
            try {
                System.in.read();
            } catch (Exception e) {
                e.printStackTrace();
            }
            //zk连接关闭成功
            zkClient.close();
        }

}
